local blackListKey = KEYS[1]
local methodKey = KEYS[2]

local ip = tostring(ARGV[1])
local count = tonumber(ARGV[2])
local time = tonumber(ARGV[3])
local timeStamp = tonumber(ARGV[4])

-- 判断黑名单中是否存在当前iP
local isBlackIP = redis.call('sismember', blackListKey, ip)
if tonumber(isBlackIP) > 0 then
    return true
end

local minTime = timeStamp - time * 1000

-- 移除滑动窗口之外的数据
redis.call('zremrangebyscore',methodKey,0,minTime)
-- 统计窗口数据
local zcount = redis.call('zcard',methodKey)

-- 判断当前数量是否达到限制
if zcount and tonumber(zcount) >= count then
    -- 当前数量大于被限制的数量,将当前IP放入黑名单中
    redis.call('sadd', blackListKey,ip)
    return true
end

-- 将当前记录放入zset中，并刷新过期时间
redis.call('zadd',methodKey,timeStamp,timeStamp)
-- 设置过期时间
redis.call('expire', methodKey, time)
return false
